<div id="content">
	<h1>控制器</h1>
	<p class="mar_t_10">
	　　<strong>控制器</strong> 是 <strong>dpControl</strong> 或其子类的实例。它在当用户请求时由应用创建。当一个控制器运行时，它执行所请求的动作，动作通常会引入所必要的模型并渲染相应的视图。 <br />
	　　<strong>动作</strong> 的最简形式，就是一个名字以 <strong>action</strong> 开头的控制器类方法。<br />
　　控制器通常有一个默认的动作。当用户的请求未指定要执行的动作时，默认动作将被执行。 默认情况下，默认的动作名为 <strong>index</strong><br />
	　　如下是一个控制器类所需的最简代码。由于此控制器未定义任何动作，对它的请求将抛出一个异常。
	</p>
	<pre class="syntax php">&lt;?php
	class IndexControl extends dpControl
	{
	}
?&gt;</pre>
	<br />
	<h1>访问</h1>
	<p class="mar_t_10">
	　　控制器和动作以 <strong>ID</strong> 识别。控制器 <strong>ID</strong> 是一种 'xyz/edit' 的格式，对应相应的控制器类文件 <strong>app/control/XyzControl.php</strong>, 其中的标志 <strong>xyz</strong> 应被替换为实际的名字 (例如 <strong>post</strong> 对应 <strong>app/control/PostControl.php</strong>). 动作 ID 是除去 <strong>action</strong> 前缀的动作方法名。例如，如果一个控制器类含有一个名为 <strong>actionEdit</strong> 的方法，则相应的动作 ID 为 <strong>edit</strong>。<br />
	　　用户请求特定的控制器和动作。是由控制器 ID 和动作 ID 连接起来的，两者以斜线分割。 例如，<strong>post/edit</strong> 代表 <strong>PostControl</strong> 及其 <strong>edit</strong> 动作。默认情况下，URL <strong>http://hostname/index.php?c=post&a=edit</strong> 即请求此控制器和动作。<br />
	　　如果用户访问不存在的控制器，将会抛出一个 <strong>404</strong> 错误的页面
	</p>
	<h1>动作</h1>
	<p class="mar_t_10">
	　　如前文所述，动作可以被定义为一个以 action 单词作为前缀命名的方法。而更高级的方式是定义一个动作类并让控制器在收到请求时将其实例化。 这使得动作可以被复用，提高了可复用度。<br />

	　　要定义一个新动作类，可用如下代码：
	</p>
	<pre class="syntax php">&lt;?php
	class LoginAction extends dpAction
	{
	    public function run()
	    {
	        // 这里执行登陆
	    }
	}
?&gt;</pre>
	<br />
	<p class="mar_t_10">
	　　为了让控制器注意到这个动作，我们要用如下方式覆盖控制器类的 <strong>actions()</strong> 方法：
	</p>
	<pre class="syntax php">&lt;?php
	class PostControl extends dpControl
	{
	    public function actions()
	    {
	        return array(
	            'user'=>'app:action.post.LoginAction',
	        );
	    }
	}
?&gt;</pre>
	<br />
	<p class="mar_t_10">
	　　如上所示，我们使用了路径别名 <strong>app:action.post.LoginAction</strong> 指定动作类文件为 <strong>app/action/post/LoginAction.php</strong><br />
	　　通过编写基于类的动作，我们可以将应用组织为模块的风格。例如， 如下目录结构可用于组织控制器相关代码：
	</p>
	<pre class="syntax php">

app/
    control/
        PostControl.php
        UserControl.php
    action/
        post/
            CreateAction.php
            ReadAction.php
            UpdateAction.php
        user/
            CreateAction.php
            ListAction.php
            ProfileAction.php
            UpdateAction.php
	</pre>
	<br />
	<div class="notice">
		通常情况下，独立的动作文件一般放置在 <strong>app/action</strong> 下面
	</div>
	<br />
	<h1>动作参数绑定</h1>
	<p class="mar_t_10">
	　　DP 提供了对自动动作参数绑定的支持。 就是说，控制器动作可以定义命名的参数，参数的值将由 DP 自动从 <strong>$_GET</strong> 填充。<br />
	　　为了详细说明此功能，假设我们需要为 <strong>PostControl</strong> 写一个 <strong>create</strong> 动作。此动作需要两个参数：<br />
	　　<strong>category</strong>: 一个整数，代表帖子（post）要发表在的那个分类的ID。<br />
	　　<strong>language</strong>: 一个字符串，代表帖子所使用的语言代码。<br />
	　　从 <strong>$_GET</strong> 中提取参数时，我们可以不再下面这种无聊的代码了：<br />
	</p>
	<pre class="syntax php">&lt;?php
	class PostControl extends dpControl
	{
	    public function actionCreate()
	    {
	        if(isset($_GET['category']))
	            $category=(int)$_GET['category'];
	 
	        if(isset($_GET['language']))
	            $language=$_GET['language'];
	        else
	            $language='en';
	 
	        // ......
	    }
	}
?&gt;</pre>
	<p class="mar_t_10">
	　　现在使用动作参数功能，我们可以更轻松的完成任务：
	</p>
	<pre class="syntax php">&lt;?php
	class PostControl extends dpControl
	{
	    public function actionCreate($category, $language = 'en')
	    {
	        $category=(int)$category;
	        
	        // ......
	    }
	}
?&gt;</pre>
</div>
<script type="text/javascript">
$(function() {
	jQuery.syntax();
});
</script>